// 用户
package user

import (
	"goHelpers/app/constant"
	"goHelpers/app/entity"
	"goHelpers/app/http/controller"
	logic "goHelpers/app/logic/user"
	"goHelpers/app/validate"
	captchaHelper "goHelpers/helper/captcha"

	myErr "goHelpers/app/error"
	errMsg "goHelpers/app/error/common"

	"github.com/gin-gonic/gin"
)

// userController 控制器结构体
type userController struct {
	controller.BaseController
}

// NewController 实例化结构体控制器
func NewController(ctx *gin.Context) *userController {
	return &userController{controller.NewBaseController(ctx)}
}

// Register 注册
func (c *userController) Register() {
	// 获取参数
	userInfo := &entity.User{}
	c.ShouldBindJSON(userInfo)

	// 验证
	err := validate.User(userInfo)
	if err != nil {
		c.Fail(err.Code(), err.Message(), nil)
		return
	}

	// 验证验证码
	if !captchaHelper.Verify(c.GCtx, userInfo.CaptchaId, userInfo.Captcha, constant.CaptchaConfig) {
		err.SetCodeMsg(errMsg.CaptchaErr)
		c.Fail(err.Code(), err.Message(), nil)
		return
	}

	// 处理逻辑
	l := logic.NewLogic(c.GCtx)

	// 注册
	affectedRows, err := l.Register(userInfo)
	if err != nil {
		c.Fail(err.Code(), err.Message(), nil)
		return
	}

	// 返回数据
	rdata := map[string]interface{}{
		"affectedRows": affectedRows,
	}

	// 返回
	c.Success(rdata, "")
}

// Login 登录
func (c *userController) Login() {
	// 错误
	err := myErr.NewError("common")

	// 获取参数
	userInfo := &entity.User{}
	c.ShouldBindJSON(userInfo)

	// 验证
	errV := validate.User(userInfo)
	if errV != nil {
		c.Fail(errV.Code(), errV.Message(), nil)
		return
	}

	// 验证验证码
	if !captchaHelper.Verify(c.GCtx, userInfo.CaptchaId, userInfo.Captcha, constant.CaptchaConfig) {
		err.SetCodeMsg(errMsg.CaptchaErr)
		c.Fail(err.Code(), err.Message(), nil)
		return
	}

	// 处理逻辑
	l := logic.NewLogic(c.GCtx)

	// 注册
	token, err := l.Login(userInfo)
	if err != nil {
		c.Fail(err.Code(), err.Message(), nil)
		return
	}

	// 返回数据
	rdata := map[string]interface{}{
		"token": token,
	}

	// 返回
	c.Success(rdata, "")
}

// Info 获取信息
func (c *userController) Info() {
	// 获取参数
	user_id := c.GetUserId()
	// user_id := c.GetUserIdByToken()

	// 实例化模型
	l := logic.NewLogic(c.GCtx)
	rdata := l.Info(user_id)

	// 返回
	c.Success(rdata, "")
}

// List 获取列表
func (c *userController) List() {
	// 获取参数
	req := entity.PageParams{
		Page:  c.GetQueryDefault("page", "1").Int(),
		Limit: c.GetQueryDefault("limit", "20").Int(),
		Params: map[string]interface{}{
			"username": c.GetQueryDefault("username", "").Value(),
		},
	}

	// 实例化模型
	l := logic.NewLogic(c.GCtx)
	rdata := l.List(&req)

	// 返回
	c.Success(rdata, "")
}

// GetCaptcha 获取验证码
func (c *userController) GetCaptcha() {
	// 错误
	err := myErr.NewError("common")

	// 获取验证码
	rdata, cErr := captchaHelper.Generate(c.GCtx, constant.CaptchaConfig)
	if cErr != nil {
		err.SetCodeMsg(errMsg.CaptchaErr)
		c.Fail(err.Code(), err.Message(), nil)
		return
	}

	// 返回
	c.Success(rdata, "")
}

// Redis redis操作
func (c *userController) Redis() {

	// 获取参数
	user_id := c.GetUserId()

	// 实例化模型
	l := logic.NewLogic(c.GCtx)
	rdata := l.Redis(user_id)

	// 返回
	c.Success(rdata, "")
}
